2019 SDNU Contest 14 赛后总结

总结一下5月2日比赛: 除去最强的师哥队,每支队伍都A了6题,但是我们却A了5道。 我赛后总结一下,是真的读不懂题啊。。。

比赛链接

A题

上来顺耳听到是个签到题,一看这不寒假做过的一道差不多的题么。纯粹考察英语,趁着想着点东西赶紧敲。给你一个数字,让你输出对应形式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <queue>
#include <set>
#include <map>hexo
using namespace std;
int main()
{
int n;
int num;
while(cin >> n){
while(n--)
{
cin >> num;
if(num % 10 == 1 && num % 100 != 11)
{
cout << num << "st" << endl;
}
else if(num % 10 == 2 && num % 100 != 12)
{
cout << num << "nd" << endl;
}
else if(num % 10 == 3 && num % 100 != 13){
cout << num << "rd" << endl;
}
else{
cout << num << "th" << endl;
}
}
}
}

B题

输入a b c d e f六个数字,按题目的格式写出来。看看这个形式下的公式是双曲线 还是椭圆 还是抛物线,还是圆。和队友讨论一会,确定绝对正确的答案之后开敲。WA了,想了好一段时间,愣是不知道为什么WA,直到看到 输入的a b c d e f 是实数,我们惊呆了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <queue>
#include <set>
#include <map>
#include <stdio.h>
#include <math.h>
using namespace std;
const double eps = 1e-6;
int main()
{
int t;
double a,b,c,d,e,f;
scanf("%d",&t);
while(t--){
cin >> a >>b >>c >> d >> e >> f;
if(fabs(a - c) < eps)
{
printf("circle\n");
}
else if((fabs(a*1.0 - 0.0)) < eps || (fabs(c*1.0 - 0.0)) < eps)
{
printf("parabola\n");
}
else if(a * c > 0 )
{
printf("ellipse\n");
}
else{
printf("hyperbola\n");
}
}
}

D题

模拟题,题目怎么说就怎么做。问题是读不懂啊。能A过的都是神仙QAQ。 题意这里就不列举了。太长了。 不过这道题还是有收获的。 再输出string s 的时候,如果 cout << s << endl 超时 用 cout << s <<

‘\n’ 就过了,一个10ms,一个超时,什么鬼啊。 好吧,看见宝乐总结的了但是没有放在心上,我长记性了QWQ。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cstring>
#include <string>
using namespace std;
int check(char s)
{
if(isdigit(s) || isalpha(s))
{
return 1;
}
else
return 0;
}
int change(string &s, int n,int flag,char &ch,int &last)
{
if(flag == 0)
return 0;
last = n;
if(flag == 1)
{
s[n] += 1;
if(s[n] == 'z' + 1)
{
s[n] = 'a';
ch = 'a';
return 1;
}
else if(s[n] == 'Z' + 1)
{
s[n] = 'A';
ch = 'A';
return 1;
}
else if(s[n] == '9' + 1)
{
s[n] = '0';
ch = '1';
return 1;
}
else{
return 0;
}
}
}
int main()
{
int T, n;
string s;
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(0);
cin >> T;
while(T--)
{
cin >> s >> n;
while(n--)
{
int index;
int sz = s.size() - 1, i;
for(i = sz; i >= 0; --i)
{
if(check(s[i]))
{
index = i;
break;
}
}
if(i == -1)
{
s[sz]++;
}
else
{
string s1;
char ch;
int flag = 1,last;
while(1)
{
flag = change(s,index,flag,ch,last);
if(!flag)
break;
for( i = index - 1; i >= 0; --i)
{
if(check(s[i]))
{
index = i;
break;
}
}
if(i == -1 && flag)
{
s.insert(s.begin() + last, ch);
break;
}
if(i == -1)
{
break;
}
}
}
cout << s << '\n';
}
cout << '\n';
}

}

F题

F题是我们过的比较茫然的,题目我们都不太理解,但是其他队伍也都早早A了,而且代码很短,于是我快速按规律敲了一遍,WA了,于是我认为是我的没理解题意导致的,就先放在一边了。后来想到了其中的BUG,人的名字是一个circle,所以还是在茫然的状态下又来了一遍,A了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <queue>
#include <set>
#include <map>
#include <stdio.h>
#include <math.h>
using namespace std;
int main()
{
int t,n,index;
scanf("%d",&t);
while(t--){
string s[2001];
string s1;
cin >> n >> s1;
for(int i = 1; i <= n; ++i)
{
cin >> s[i];
}
for(int i = 1;i <= n; i++)
{
if(s[i] == s1)
{
index = i;
break;
}
}
int counter = 0;
int flag = 0;
for(int i = index ; i <= n; ++i)
{
if(counter == n/2)
{
flag = 1;
cout << s[i] << endl;
break;
}
counter++;
}
if(!flag)
{
for(int i = 1; i <= n; ++i)
{
if(counter == n /2)
{
cout << s[i] << endl;
break;
}
counter++;
}
}
}
}

L题

嗯,又是一个类似寒假做过的题目,但是我是真的忘了。队友提出了她的规律公式 f[n] = f[n / 2] + 1, 验证了一下,果然正确,好强大。 问题是n可以达到1e9, 于是我按照这个公式手写了一下前几项,发现其实可以用Log2(n)来计算。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <queue>
#include <set>
#include <map>
#include <stdio.h>
#include <math.h>
using namespace std;
int main()
{
int t,n;
while(scanf("%d",&t)!= EOF)
{
while(t--)
{
cin >> n;
int a = (int)log2(n);
cout << a + 1 << endl;
}
}
}

M题

找中位数的水题,第二道A的题目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <queue>
#include <set>
#include <map>
#include <stdio.h>
using namespace std;
int cmp(double a,double b)
{
return a < b;
}
int main()
{
int n;
int t;
double a[10001];
while(scanf("%d",&t)!=EOF)
{
while(t--){
cin >> n;
for(int i = 1; i <= n; ++i)
{
scanf("%lf",&a[i]);
}
sort(a + 1,a + n + 1,cmp);
if(n % 2 == 1)
{
printf("%.3f\n",a[n / 2 + 1]);
}
else{
printf("%.3f\n",(a[n/ 2] + a[n/2+1])/2.0);
}
}
}
}